#!/bin/bash

#
# Nombre:      postonio.sh
# Autor:       Mariano Gonzalez Elias <mgonzel@gmail.com>
# Fecha:       06/05/2011
# Descripcion: Programa daemon de revision de archivos para procesar.
#	       Recibe los archivos, verifica su correcto nombre y secuencia y 
#		ejecuta la postulacion llamando a postini.h
#

#
# Modo de uso:
# ---- -- ---
# Comando:
# ./postonio.sh
#
# Precondicion:
# Deben estar seteadas las variables ARRIDIR y grupo
#


cicleSleepTime=5
postularSleepTime=5

RECIDIR=$grupo/recibidos
RECHAZDIR=$grupo/rechazados

fileAgenciaSeq=$grupo/conf/agencia.seq

##  Verificador de que no exista un proceso en curso al momento de salir
function cleanup {
	waitForPostulaRecibidos
	. gralog.sh "POSTONIO" "Exit solicitado. Terminando daemon POSTONIO." "I";
	exit 0
}

## Consulta proceso activo de postular
function waitForPostulaRecibidos {
	while [ "$POSTULAR_EN_EJECUCION" = "SI"  ]; do 
		sleep $postularSleepTime
	done;
}

## validacion de archivo recibido
function validarArchivo {
	archivo=$1
  
	#Chequeo que el formato del archivo es correcto
	if [ -n `echo "$archivo" | grep "^[a-zA-Z]\{6\}\.[0-9]\{6\}$"` ]; then    

		agencia=${archivo%.*}

		#Valido que la agencia se encuentre en el maestro de agencias
		verifagencia=`cat $grupo/data/agencias.mae | grep ",$agencia," | cut -d, -f 2`

		if [ -n "$verifagencia" -a "$agencia" == "$verifagencia" ]
		then
			secuencia=${archivo##*.}

			lastsecuencia="0";

			if [ -f "$fileAgenciaSeq" ]
			then
				lastsecuencia=`cat "$fileAgenciaSeq" | grep "^$agencia=" | cut -d= -f 2`

				existeSeq="true"
				if [ -z $lastsecuencia ] 
				then
					lastsecuencia=000000
					existeSeq="false"
				fi;
			else
				existeSeq="false"
			fi;


			#Comparo que la secuencia del archivo sea mayor que la ultima secuencia
			# Si es true entonces guardo el valor de nueva secuencia y retorno OK

			archEsValido=$(( $lastsecuencia < $secuencia  ))


			# si es secuencia valida entonces guardo nuevo valor
			if [ $archEsValido = 1 ]
			then
				#Grabo la nueva clave de la agencia, si no existia la clave la agrego
				if [ $existeSeq = "true" ]; then
					sed -i s/^$agencia=.*/$agencia=$secuencia/ "$fileAgenciaSeq"
				else
					echo "$agencia=$secuencia" >> "$fileAgenciaSeq"
				fi

				#Mensaje archivo valido
				msgProc="$archivo: Archivo de agencia valido: secuencia correcta. Ultima secuencia: $lastsecuencia, secuencia ingresada: $secuencia"
				msgType="I"
			else
				#Mensaje de secuencia invalida
				msgProc="$archivo: Archivo de agencia invalido: secuencia erronea. Ultima secuencia: $lastsecuencia, secuencia ingresada: $secuencia"
				msgType="E"
			fi

		else
			msgProc="$archivo: Archivo de agencia invalido: no existe la agencia $agencia en el maestro de agencias"
			msgType="E"
			archEsValido=0
		fi

		##  Imprimo y logueo resultado, si es agencia valida, si es secuencia valida
		. gralog.sh "POSTONIO" "$msgProc" "$msgType"

		#0 = true para el return, se niega entonces archEsValido
		return $(( !($archEsValido) ))

	fi

	#LOG DE NOMBRE DE ARCHIVO NO VALIDO
	msgProc="$archivo: Nombre de archivo de agencia invalido"
	. gralog.sh "POSTONIO" "$msgProc" "E"

	return 1 
}


#Valida tener permisos de escritura sobre recibidos y rechazados y de lectura sobre arridir
function validarPermisosDir {

	#si es 0, es valido, sino invalido
	permisoValido=0

	if [ ! -w "$fileAgenciaSeq" ]
	then
		permisoValido=1
		. gralog.sh "POSTONIO" "No se tiene permisos de escritura sobre el archivo de secuencias de agencias" "E"
	fi

	if [ ! -r "$ARRIDIR" ]
	then
		permisoValido=1
		. gralog.sh "POSTONIO" "No se tiene permisos de lectura sobre el directorio de arribos" "E"
	fi

	if [ ! -w "$RECIDIR" ]
	then
		permisoValido=1
		. gralog.sh "POSTONIO" "No se tiene permisos de escritura sobre el directorio de archivos recibidos" "E"
	fi

	if [ ! -w "$RECHAZDIR" ]
	then
		permisoValido=1
		. gralog.sh "POSTONIO" "No se tiene permisos de escritura sobre el directorio de archivos rechazados" "E"
	fi


	return $(( $permisoValido ))
}


#setear traps para terminar el demonio
trap cleanup INT TERM

#Inicio del daemon
. gralog.sh "POSTONIO" "Inicio del daemon POSTONIO." "I";

if [ ! validarPermisosDir ]
then
	. gralog.sh "POSTONIO" "FATAL: error en la validacion de permisos sobre los archivos / directorios" "F"
	exit 1
fi

#bucle infinito
while true; do
	for archivo in $(ls $ARRIDIR); do
    
		if validarArchivo $archivo
		then
			. mover.sh "$ARRIDIR/$archivo" "$RECIDIR/$archivo" "POSTONIO"
		else
			. mover.sh "$ARRIDIR/$archivo" "$RECHAZDIR/$archivo" "POSTONIO"
		fi

	done
  
	for recibidos in $(ls $RECIDIR); do
		waitForPostulaRecibidos
		. gralog.sh "POSTONIO" "Ejecutando postular.sh" "I";
		. postular.sh 
	done

	sleep $cicleSleepTime

done

